package com.example.demo2recursion;

import java.io.File;

/**
 * 目标：完成文件搜索。找出D:盘下的QQ.exe的位置。
 */
public class FileSearchTest4 {
    public static void main(String[] args) {
        // 思路分析
        // 1.先找出D:盘下的所有一级文件对象
        // 2.遍历全部一级文件对象，判断是否是文件
        // 3.如果是文件，判断是否是自己想要的
        // 4.如果是文件夹，需要继续进入到该文件夹，重复上述过程

        File dir = new File("D:\\");
        try {
            searchFile(dir, "QQ.exe");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 搜索文件
     * @param dir 搜索的目录
     * @param fileName 搜索的文件名称
     */
    public static void searchFile(File dir, String fileName) throws Exception {
        // 1.判断极端情况
        // 判断dir 是否为空，或者dir不存在，或者dir是文件 则不搜索
        if (dir == null || !dir.exists() || dir.isFile()) {
            return; // 不搜索的情况
        }

        // 2.获取目录下的所有一级文件或者一级文件夹对象
        File[] files = dir.listFiles();

        // 3.判断当前目录下是否存在一级文件对象，才可以遍历
        if (files != null && files.length > 0) { // 可以避免空指针异常 因为一些没有权限的文件夹会返回null 所有增加判断
            // 4.遍历一级文件对象
            for (File file : files) {
                // 5.判断当前一级文件对象是否是文件
                if (file.isFile()) {
                    // 6.判断文件名称是否和目标文件名称一致
                    if (file.getName().contains(fileName)) {
                        System.out.println("找到目标文件：" + file.getAbsolutePath());
                        // 找到目标文件后，运行目标文件
                        Runtime r = Runtime.getRuntime();
                        r.exec(file.getAbsolutePath());
                    }
                } else {
                    // 7.如果当前一级文件对象是文件夹，则继续递归调用
                    searchFile(file, fileName);
                }
            }
        }
    }
}
